"""
处理博客下的评论
原理：根据父评论递归查找下面的子评论
将所有的子评论以列表的类型添加到父评论下的一个属性里
"""
from app.models import Comment


def find_root_sub_comment(root_comment, sub_coment_list):
    # root_comment.comment_set.all() 反向查询下一级的子评论
    for i in root_comment.comment_set.all():
        # 将子评论添加到列表中
        sub_coment_list.append(i)
        # 递归查询该评论下的子评论
        find_root_sub_comment(i, sub_coment_list)


# 序列化评论
def Serialization_comment(comment_list, lis=None):
    if lis is None:
        lis = []
    for item in comment_list:
        item_dict = {
            'nid': item.nid,
            'user': item.user.username,
            'usernid': item.user.nid,
            'content': item.content,
            'comment_count': item.comment_count,
            'digg_count': item.digg_count,
            'create_time': str(item.create_time)[0:10],
            'avatar': item.user.avatar.url.url,
            'sub_comment': [],
        }
        try:
            item_dict['sub_comment'] = Serialization_comment(item.sub_comment, item_dict['sub_comment'])
        except AttributeError:
            continue
        finally:
            lis.append(item_dict)
    return lis


# 处理父评论和子评论
def sub_comment(nid):
    comment = Comment.objects.filter(article_id=nid).order_by('-create_time')  # 获取到所有的评论
    comment_list = []  # 将父评论存储到列表
    # 循环判断查找是否为父评论
    for i in comment:
        # 如果是父评论
        if not i.parent_comment:
            lis = []  # 存储子评论的列表
            find_root_sub_comment(i, lis)
            i.sub_comment = lis  # 给父评论添加一个属性，是该父评论下的所有子评论的列表
            comment_list.append(i)
    return comment_list


# 计算子评论数
def computeCommentNumber(nid, i):
    comment = Comment.objects.get(nid=nid)
    if comment.comment_set.all():
        i += len(comment.comment_set.all())
    for item in comment.comment_set.all():
        i = computeCommentNumber(item.nid, i)
    return i
